package cn.gzmli.dtt.common.utils;

import cn.gzmli.dtt.common.entity.User;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.ListMessage;
import com.gexin.rp.sdk.base.impl.SingleMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.base.notify.Notify;
import com.gexin.rp.sdk.dto.GtReq;
import com.gexin.rp.sdk.exceptions.RequestException;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.NotificationTemplate;
import com.gexin.rp.sdk.template.TransmissionTemplate;
import com.gexin.rp.sdk.template.style.Style0;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @author yuanp
 * @date 2020.06.18
 * unipush个推sdk整合操作类
 * 透传模板：仅仅是针对后台消息，隐式传递，app接收的消息。
 * 通知模板：在本方法中，通知模板，整合了消息透传以及在app消息栏上展示通知。
 * 以上所有的模板，经测试都是在app启动之后，可以执行。
 *
 * pushMessageToList：通过对应设备的cid数组，进行批量推送。
 * pushToSingle：通过cid，进行单个推送。
 *
 * cid：每个手机安装相关应用之后，在uniapp中使用代码，会获取对应的惟一的cid，当登录之后，会自动保存到对应用户。
 *      如果用户在更换设备之后，会重新跟新。如果有相同的设备cid，则会将所有相同的cid清除之后，在去跟新当前用户的
 *      cid以确保cid的唯一性，在初次登陆时，由于cid获取，可能会有延迟，会提示2秒之后重新登录。
 */
@Component
public class PushUtils {
    /*@Value("${unipush-appId}")*/
    private static String appId = "QiDoxOAgBC7okxFoua9VN";

    /*@Value("${unipush-appKey}")*/
    private static String appKey = "RQbwAnThBC631Xo7eGWhn9";

    /*@Value("${unipush-masterSecret}")*/
    private static String masterSecret = "ZO0cWejoFd5HZqtQMaisy5";

    /*@Value("${unipush-host}")*/
    private static String host = "http://api.getui.com/apiex.htm";

    /*@Value("${unipush-offonlinetime}")*/
    private static Long offonlinetime = 259200000L;

    //透传模板
    public TransmissionTemplate getTranTemp(String tranMissMsg){
        TransmissionTemplate template = new TransmissionTemplate();
        template.setAppId(appId);
        template.setAppkey(appKey);
        template.setTransmissionType(2);//1：立即启动APP（不推荐使用，影响客户体验）2：客户端收到消息后需要自行处理
        template.setTransmissionContent(tranMissMsg);
        return template;
    }

    //通知模板
    public NotificationTemplate getNotifyTemp(String msg, String tranMissMsg){
        NotificationTemplate template = new NotificationTemplate();
        template.setAppId(appId);
        template.setAppkey(appKey);

        Style0 style = new Style0();
        // 设置通知栏标题与内容
        style.setTitle("提示");
        style.setText(msg);

        template.setStyle(style);
        // 透传消息接受方式设置，1：立即启动APP，2：客户端收到消息后需要自行处理
        template.setTransmissionType(2);

        //notify的Intent设置之后可以立即启动app，上面的值为2。
        /*Notify notify = new Notify();
        notify.setTitle("爱情");
        notify.setContent("爱情不是你想爱，想爱就能爱！");
        notify.setIntent("intent:#Intent;launchFlags=0x10000000;package=dtt.ssaApp;component=dtt.ssaApp/com.getui.demo.MainActivity;i.parm1=12;end");
        notify.setType(GtReq.NotifyInfo.Type._intent);
        //template.setTransmissionContent(tranMissMsg);
        template.set3rdNotifyInfo(notify);*/
        template.setTransmissionContent(tranMissMsg);
        return template;
    }

    //单个推送 type: 1、只使用透传模板，2、透传模板+通知模板
    public void pushToSingle(String cid,String msg,String tranMissMsg,Integer type){
        IGtPush push = new IGtPush(host, appKey, masterSecret);
        SingleMessage message = new SingleMessage();
        message.setOffline(true);
        // 离线有效时间，单位为毫秒
        message.setOfflineExpireTime(offonlinetime);
        if(type == 1){
            message.setData(getTranTemp(tranMissMsg));
        }else {
            message.setData(getNotifyTemp(msg,tranMissMsg));
        }


        // 可选，1为wifi，0为不限制网络环境。根据手机处于的网络情况，决定是否下发
        message.setPushNetWorkType(0);

        // 厂商通道下发策略
        message.setStrategyJson("{\"default\":4,\"ios\":4,\"st\":4}");
        Target target = new Target();
        target.setAppId(appId);
        target.setClientId(cid);

        IPushResult ret =  null;
        try {
            ret = push.pushMessageToSingle(message, target);
        } catch (RequestException e) {
            e.printStackTrace();
            ret = push.pushMessageToSingle(message, target, e.getRequestId());
        }
        if (ret != null) {
            System.out.println(ret.getResponse().toString());
        } else {
            System.out.println("服务器响应异常");
        }
    }

    //根据cid批量单推 type: 1、只使用透传模板，2、透传模板+通知模板
    public void pushMessageToList(String[] cids,String msg,String tranMissMsg,Integer type){
        // 配置返回每个用户返回用户状态，可选
        System.setProperty("gexin_pushList_needDetails", "true");

        IGtPush push = new IGtPush(host, appKey, masterSecret);

        ListMessage message = new ListMessage();
        if(type == 1){
            message.setData(getTranTemp(tranMissMsg));
        }else {
            message.setData(getNotifyAndTranTemp(msg,tranMissMsg));
        }
        // 设置消息离线，并设置离线时间
        message.setOffline(true);
        message.setOfflineExpireTime(offonlinetime);
        message.setStrategyJson("{\"default\":4,\"ios\":4,\"st\":4}");

        //配置推送目标
        List targetsList = new ArrayList();
        for (String cid: cids) {
            Target target = new Target();
            target.setAppId(appId);
            target.setClientId(cid);
            targetsList.add(target);
        }

        // taskId用于在推送时去查找对应的message
        String taskId = push.getContentId(message);
        IPushResult ret = push.pushMessageToList(taskId,targetsList);
        System.out.println(ret.getResponse().toString());
    }

    //透传模板+通知模板
    public NotificationTemplate getNotifyAndTranTemp(String msg,String tranMissMsg) {
        NotificationTemplate template = new NotificationTemplate();
        // 设置APPID与APPKEY
        template.setAppId(appId);
        template.setAppkey(appKey);

        Style0 style = new Style0();
        // 设置通知栏标题与内容
        style.setTitle("提示");
        style.setText(msg);

        template.setStyle(style);

        // 透传消息接受方式设置，1：立即启动APP，2：客户端收到消息后需要自行处理
        template.setTransmissionType(2);
        template.setTransmissionContent(tranMissMsg);

        return template;
    }

    public static void pushMsg(Integer userId,String clientId,String msg,String tranMissMsg){
        System.out.println("发送消息：userId="+userId+",clientId="+clientId+" , msg="+msg);
        PushUtils pushUtil = new PushUtils();
        pushUtil.pushToSingle(clientId,msg,tranMissMsg,2);
    }

    public static void main(String[] args) {
        PushUtils pushUtil = new PushUtils();
        String clientId = "b7fa420c86260f4a8426411844057c42";
        String [] cids = {"0780a573985ffcd2b03a507a7dd2ef33",clientId};
        pushUtil.pushToSingle(clientId,"我爱你，亲爱的祖国！","{id:1,name:爱情,age:22,sex:男}",2);//1、只使用透传模板，2、透传消息+在app通知栏上显示通知

        //pushUtil.pushMessageToList(cids,"测试你有一张养护计划单待巡检，请及时巡检！","wo ai ni zhong g ",2);
    }
}
